package com.jwong.grpc.customheader;

import io.grpc.*;

// 在  ServerCallHandler 调度之前拦截传入调用的​​接口。
// 实现者使用这种机制将横切行为添加到服务器端调用。此类行为的常见示例包括
// 1.强制执行有效的身份凭据验证
// 2.对调用行为进行日志记录或监控
// 3.将调用委托给其他服务器

public class HeaderServerInterceptor implements ServerInterceptor {

    // 定义一个header_key，name不能以-bin结尾
    static final Metadata.Key<String> CUSTOM_HEADER_KEY =
            Metadata.Key.of("custom_server_header_key", Metadata.ASCII_STRING_MARSHALLER);

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall,
                                                                 // 之前额外的header信息,比如身份验证信息
                                                                 Metadata metadata,
                                                                 // 用于处理call 传入消息的侦听器, never null
                                                                 ServerCallHandler<ReqT, RespT> serverCallHandler) {
        System.out.println("header received from client:" + metadata);
        // 启动传入调用的​​异步处理。
        return serverCallHandler.startCall(new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(serverCall) {
            @Override
            public void sendHeaders(Metadata responseHeaders) {
                responseHeaders.put(CUSTOM_HEADER_KEY, "customRespondValue");
                super.sendHeaders(responseHeaders);
            }
        }, metadata);
    }
}
